Skip to content

fix(v1): preserve truncated tool result bodies - #13

Merged
ranxianglei merged 2 commits into
ranxianglei:masterfrom
5258MF:2026-08-13_v1-tool-result-truncation
Aug 13, 2026
Merged

fix(v1): preserve truncated tool result bodies#13
ranxianglei merged 2 commits into
ranxianglei:masterfrom
5258MF:2026-08-13_v1-tool-result-truncation

Conversation

@5258MF

@5258MF 5258MF commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

范围

这是原 PR #3 在当前 monorepo 上的替代版本,仅修复 OpenCode V1 适配器

  • 修改 packages/billion-context-opencode/src/messages-v1.ts
  • 不修改 messages-v2.ts,也不对尚未验证的 OpenCode V2 结果结构作结论
  • pending/running 没有 V1 tool-result core,不进入本次处理流程

现象

acp-kernel 的 emergency truncate 会改写 tool-result core 的正文,但 V1 的 reassemble 在确认 tool-call 与 tool-result 都存活后,直接把原始 tool part 放回消息。结果是 kernel 已生成的截断正文被丢弃,完整工具输出仍会发送给模型。

修复

新增统一的 V1 工具结果正文投影,并在重组时按原状态回填:

  • completed:读取并写回 state.output
  • 普通 error:投影为 Error: ${state.error};回填 state.error 时只移除适配层添加的一个 Error: 前缀
  • interrupted error:当 metadata.interrupted === true 且存在字符串输出时,读取并写回 state.metadata.output

applyToolBody 仅在 kernel 正文发生实质变化时创建新 part;尾部空白差异保持原对象不变。回填通过对象展开保留原来的 statusinputerrormetadatatime 及其他宿主字段,不会把失败状态改成成功。

原有 tool call/result 配对规则保持不变;dual-shape export、持久化状态、kernel 配置和 V2 适配器均不受影响。

验证

  • 新增 4 个 V1 测试:成功结果回填、尾部空白不误判、普通错误回填并保持 error、中断输出从 metadata.output 投影并回填
  • npm run typecheck:通过
  • npm run test:30/30 通过
  • npm run build:通过
  • PR validation:通过
  • 针对真实 acp-kernel emergency truncate 的 V1 round trip:通过(12,010 字符原结果回填为 4,064 字符的带截断标记结果)

仓库现有根目录 smoke.mjs 仍引用重构前的 dist/index.js,而当前构建输出位于 packages/billion-context-opencode/dist/index.js;这是当前 master 的既有路径问题,本 PR 未扩大范围修改。

开发记录与审查

  • devlog/2026-08-13_v1-tool-result-truncation/ 包含 REQ.mdWORKLOG.mdDESIGN.md
  • 已按 AGENTS.md 要求交由两名独立 Agent 审查;审查结论记录在 PR 评论中

@5258MF

5258MF commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

Dual-agent review

AGENTS.md §5.3,最终源代码已由两名相互独立的 Agent 审查。

  • Reviewer Agent 1 — APPROVE:确认 completed / 普通 error / interrupted error 三种 V1 终态映射正确,状态外壳和 call/result pairing 保持不变,messages-v2.ts 零差异。
  • Reviewer Agent 2 — APPROVE:反例检查覆盖错误前缀、空输出、中断 metadata、任意外壳字段、pending/running;未发现阻断项。

验证:npm run typecheck PASS、npm run test 30/30 PASS、npm run build PASS、git diff --check PASS、PR validation PASS;另用真实 acp-kernel emergency truncate 验证 V1 round trip,12,010 字符结果被回填为 4,064 字符的带截断标记结果。

非阻断剩余风险:尚未运行真实 OpenCode V1 端到端;空字符串 result core 按无改写处理(当前 kernel 截断结果始终非空)。V2 明确不在本 PR 范围内。

# Conflicts:
#	packages/billion-context-opencode/src/messages-v1.ts
#	packages/billion-context-opencode/tests/messages.test.ts
@ranxianglei
ranxianglei merged commit 16463b5 into ranxianglei:master Aug 13, 2026
3 checks passed
@ranxianglei ranxianglei mentioned this pull request Aug 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants